using System;
using System.Collections.Generic;

namespace Algorithm.LeetCode
{
    /// <summary>
    /// 第一题：两数之和
    /// </summary>
    public class No1
    {
        /*
         * 给定一个整数数组 nums 和一个整数目标值 target，请你在该数组中找出 和为目标值 target 的那两个整数，并返回它们的数组下标。
         * 你可以假设每种输入只会对应一个答案。但是，数组中同一个元素在答案里不能重复出现。
         * 你可以按任意顺序返回答案。
         * 提示：
         *
         * 2 <= nums.length <= 104
         * -109 <= nums[i] <= 109
         * -109 <= target <= 109
         * 只会存在一个有效答案
         */

        public static int[] TwoSumV1(int[] nums, int target)
        {
            for (var i = 0; i < nums.Length; i++)
            {
                for (var j = i + 1; j < nums.Length; j++)
                {
                    if (nums[i] + nums[j] == target)
                    {
                        return new int[] {i, j};
                    }
                }
            }

            throw new Exception("无结果");
        }

        public static int[] TwoSumV2(int[] nums, int target)
        {
            var dic = new Dictionary<int, int>();
            for (var i = 0; i < nums.Length; i++)
            {
                var temp = target - nums[i];
                if (dic.ContainsKey(temp))
                {
                    return new[] {dic[temp], i};
                }

                dic.Add(nums[i], i);
            }

            throw new Exception("无结果");
        }
    }
}